#include "HP45.h"

//HP45控制喷墨的函数 将数据映射到喷头上
/*********************************
*函数名称： HP45_PrintData
*函数功能： 45 的喷头映射函数并且控制喷头喷墨
*输入参数： dat是存储数据的buf 不同的机器需要的数据长度不同  45 为19byte长度
*输出参数： none
**********************************/
void HP45_PrintData(uint8_t*left_dot_data)
{
	uint16_t Add_power_data	=	0;
	
    //提速补偿 高电平
    GPIO_SetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,1);//1.6us   840ns
	Add_power_data|=(u16)(left_dot_data[0]&0x0001);
	Add_power_data|=(u16)(left_dot_data[2]&0x0040)>>4;
	Add_power_data|=(u16)(left_dot_data[5]&0x0010);
	Add_power_data|=(u16)(left_dot_data[8]&0x0004)<<4;
	Add_power_data|=(u16)(left_dot_data[11]&0x0001)<<8;
	Add_power_data|=(u16)(left_dot_data[13]&0x0040)<<4;
	Add_power_data|=(u16)(left_dot_data[16]&0x0010)<<8;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,2);
	Add_power_data|=(u16)(left_dot_data[0]&0x0008)>>3;
	Add_power_data|=(u16)(left_dot_data[3]&0x0002)<<1;
	Add_power_data|=(u16)(left_dot_data[5]&0x0080)>>3;
	Add_power_data|=(u16)(left_dot_data[8]&0x0020)<<1;
	Add_power_data|=(u16)(left_dot_data[11]&0x0008)<<5;
	Add_power_data|=(u16)(left_dot_data[14]&0x0002)<<9;
	Add_power_data|=(u16)(left_dot_data[16]&0x0080)<<5;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,3);
	Add_power_data|=(u16)(left_dot_data[0]&0x0040)>>6;
	Add_power_data|=(u16)(left_dot_data[3]&0x0010)>>2;
	Add_power_data|=(u16)(left_dot_data[6]&0x0004)<<2;
	Add_power_data|=(u16)(left_dot_data[9]&0x0001)<<6;
	Add_power_data|=(u16)(left_dot_data[11]&0x0040)<<2;
	Add_power_data|=(u16)(left_dot_data[14]&0x0010)<<6;
	Add_power_data|=(u16)(left_dot_data[17]&0x0004)<<10;
	L6452_PowerOutput(Add_power_data);

    //提速补偿 低电平
    GPIO_ResetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,4);
	Add_power_data|=(u16)(left_dot_data[1]&0x0002)>>1;
	Add_power_data|=(u16)(left_dot_data[3]&0x0080)>>5;
	Add_power_data|=(u16)(left_dot_data[6]&0x0020)>>1;
	Add_power_data|=(u16)(left_dot_data[9]&0x0008)<<3;
	Add_power_data|=(u16)(left_dot_data[12]&0x0002)<<7;
	Add_power_data|=(u16)(left_dot_data[14]&0x0080)<<3;
	Add_power_data|=(u16)(left_dot_data[17]&0x0020)<<7;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,5);
	Add_power_data|=(u16)(left_dot_data[1]&0x0010)>>4;
	Add_power_data|=(u16)(left_dot_data[4]&0x0004);
	Add_power_data|=(u16)(left_dot_data[7]&0x0001)<<4;
	Add_power_data|=(u16)(left_dot_data[9]&0x0040);
	Add_power_data|=(u16)(left_dot_data[12]&0x0010)<<4;
	Add_power_data|=(u16)(left_dot_data[15]&0x0004)<<8;
	Add_power_data|=(u16)(left_dot_data[18]&0x0001)<<12;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,6);
	Add_power_data|=(u16)(left_dot_data[1]&0x0080)>>7;
	Add_power_data|=(u16)(left_dot_data[4]&0x0020)>>3;
	Add_power_data|=(u16)(left_dot_data[7]&0x0008)<<1;
	Add_power_data|=(u16)(left_dot_data[10]&0x0002)<<5;
	Add_power_data|=(u16)(left_dot_data[12]&0x0080)<<1;
	Add_power_data|=(u16)(left_dot_data[15]&0x0020)<<5;
	Add_power_data|=(u16)(left_dot_data[18]&0x0008)<<9;
	L6452_PowerOutput(Add_power_data);

    //提速补偿 高电平
    GPIO_SetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,7);
	Add_power_data|=(u16)(left_dot_data[2]&0x0004)>>2;
	Add_power_data|=(u16)(left_dot_data[5]&0x0001)<<2;
	Add_power_data|=(u16)(left_dot_data[7]&0x0040)>>2;
	Add_power_data|=(u16)(left_dot_data[10]&0x0010)<<2;
	Add_power_data|=(u16)(left_dot_data[13]&0x0004)<<6;
	Add_power_data|=(u16)(left_dot_data[16]&0x0001)<<10;
	Add_power_data|=0;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,8);
	Add_power_data|=0;
	Add_power_data|=(u16)(left_dot_data[2]&0x0020)>>3;
	Add_power_data|=(u16)(left_dot_data[5]&0x0008)<<1;
	Add_power_data|=(u16)(left_dot_data[8]&0x0002)<<5;
	Add_power_data|=(u16)(left_dot_data[10]&0x0080)<<1;
	Add_power_data|=(u16)(left_dot_data[13]&0x0020)<<5;
	Add_power_data|=(u16)(left_dot_data[16]&0x0008)<<9;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,9);
	Add_power_data|=(u16)(left_dot_data[0]&0x0004)>>2;
	Add_power_data|=(u16)(left_dot_data[3]&0x0001)<<2;
	Add_power_data|=(u16)(left_dot_data[5]&0x0040)>>2;
	Add_power_data|=(u16)(left_dot_data[8]&0x0010)<<2;
	Add_power_data|=(u16)(left_dot_data[11]&0x0004)<<6;
	Add_power_data|=(u16)(left_dot_data[14]&0x0001)<<10;
	Add_power_data|=(u16)(left_dot_data[16]&0x0040)<<6;
	L6452_PowerOutput(Add_power_data);

    //提速补偿 低电平
    GPIO_ResetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,10);
	Add_power_data|=(u16)(left_dot_data[0]&0x0020)>>5;
	Add_power_data|=(u16)(left_dot_data[3]&0x0008)>>1;
	Add_power_data|=(u16)(left_dot_data[6]&0x0002)<<3;
	Add_power_data|=(u16)(left_dot_data[8]&0x0080)>>1;
	Add_power_data|=(u16)(left_dot_data[11]&0x0020)<<3;
	Add_power_data|=(u16)(left_dot_data[14]&0x0008)<<7;
	Add_power_data|=(u16)(left_dot_data[17]&0x0002)<<11;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,11);
	Add_power_data|=(u16)(left_dot_data[1]&0x0001);
	Add_power_data|=(u16)(left_dot_data[3]&0x0040)>>4;
	Add_power_data|=(u16)(left_dot_data[6]&0x0010);
	Add_power_data|=(u16)(left_dot_data[9]&0x0004)<<4;
	Add_power_data|=(u16)(left_dot_data[12]&0x0001)<<8;
	Add_power_data|=(u16)(left_dot_data[14]&0x0040)<<4;
	Add_power_data|=(u16)(left_dot_data[17]&0x0010)<<8;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,12);
	Add_power_data|=(u16)(left_dot_data[1]&0x0008)>>3;
	Add_power_data|=(u16)(left_dot_data[4]&0x0002)<<1;
	Add_power_data|=(u16)(left_dot_data[6]&0x0080)>>3;
	Add_power_data|=(u16)(left_dot_data[9]&0x0020)<<1;
	Add_power_data|=(u16)(left_dot_data[12]&0x0008)<<5;
	Add_power_data|=(u16)(left_dot_data[15]&0x0002)<<9;
	Add_power_data|=(u16)(left_dot_data[17]&0x0080)<<5;
	L6452_PowerOutput(Add_power_data);
	
    //提速补偿 高电平
    GPIO_SetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_A,13);
	Add_power_data|=(u16)(left_dot_data[1]&0x0040)>>6;
	Add_power_data|=(u16)(left_dot_data[4]&0x0010)>>2;
	Add_power_data|=(u16)(left_dot_data[7]&0x0004)<<2;
	Add_power_data|=(u16)(left_dot_data[10]&0x0001)<<6;
	Add_power_data|=(u16)(left_dot_data[12]&0x0040)<<2;
	Add_power_data|=(u16)(left_dot_data[15]&0x0010)<<6;
	Add_power_data|=(u16)(left_dot_data[18]&0x0004)<<10;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,1);
	Add_power_data|=(u16)(left_dot_data[2]&0x0002)>>1;
	Add_power_data|=(u16)(left_dot_data[4]&0x0080)>>5;
	Add_power_data|=(u16)(left_dot_data[7]&0x0020)>>1;
	Add_power_data|=(u16)(left_dot_data[10]&0x0008)<<3;
	Add_power_data|=(u16)(left_dot_data[13]&0x0002)<<7;
	Add_power_data|=(u16)(left_dot_data[15]&0x0080)<<3;
	Add_power_data|=(u16)(left_dot_data[18]&0x0020)<<7;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,2);
	Add_power_data|=0;
	Add_power_data|=(u16)(left_dot_data[2]&0x0010)>>2;
	Add_power_data|=(u16)(left_dot_data[5]&0x0004)<<2;
	Add_power_data|=(u16)(left_dot_data[8]&0x0001)<<6;
	Add_power_data|=(u16)(left_dot_data[10]&0x0040)<<2;
	Add_power_data|=(u16)(left_dot_data[13]&0x0010)<<6;
	Add_power_data|=(u16)(left_dot_data[16]&0x0004)<<10;
	L6452_PowerOutput(Add_power_data);

    //提速补偿 低电平
    GPIO_ResetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,3);
	Add_power_data|=(u16)(left_dot_data[0]&0x0002)>>1;
	Add_power_data|=(u16)(left_dot_data[2]&0x0080)>>5;
	Add_power_data|=(u16)(left_dot_data[5]&0x0020)>>1;
	Add_power_data|=(u16)(left_dot_data[8]&0x0008)<<3;
	Add_power_data|=(u16)(left_dot_data[11]&0x0002)<<7;
	Add_power_data|=(u16)(left_dot_data[13]&0x0080)<<3;
	Add_power_data|=(u16)(left_dot_data[16]&0x0020)<<7;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,4);
	Add_power_data|=(u16)(left_dot_data[0]&0x0010)>>4;
	Add_power_data|=(u16)(left_dot_data[3]&0x0004);
	Add_power_data|=(u16)(left_dot_data[6]&0x0001)<<4;
	Add_power_data|=(u16)(left_dot_data[8]&0x0040);
	Add_power_data|=(u16)(left_dot_data[11]&0x0010)<<4;
	Add_power_data|=(u16)(left_dot_data[14]&0x0004)<<8;
	Add_power_data|=(u16)(left_dot_data[17]&0x0001)<<12;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,5);
	Add_power_data|=(u16)(left_dot_data[0]&0x0080)>>7;
	Add_power_data|=(u16)(left_dot_data[3]&0x0020)>>3;
	Add_power_data|=(u16)(left_dot_data[6]&0x0008)<<1;
	Add_power_data|=(u16)(left_dot_data[9]&0x0002)<<5;
	Add_power_data|=(u16)(left_dot_data[11]&0x0080)<<1;
	Add_power_data|=(u16)(left_dot_data[14]&0x0020)<<5;
	Add_power_data|=(u16)(left_dot_data[17]&0x0008)<<9;
	L6452_PowerOutput(Add_power_data);

    //提速补偿 高电平
    GPIO_SetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,6);
	Add_power_data|=(u16)(left_dot_data[1]&0x0004)>>2;
	Add_power_data|=(u16)(left_dot_data[4]&0x0001)<<2;
	Add_power_data|=(u16)(left_dot_data[6]&0x0040)>>2;
	Add_power_data|=(u16)(left_dot_data[9]&0x0010)<<2;
	Add_power_data|=(u16)(left_dot_data[12]&0x0004)<<6;
	Add_power_data|=(u16)(left_dot_data[15]&0x0001)<<10;
	Add_power_data|=(u16)(left_dot_data[17]&0x0040)<<6;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,7);
	Add_power_data|=(u16)(left_dot_data[1]&0x0020)>>5;
	Add_power_data|=(u16)(left_dot_data[4]&0x0008)>>1;
	Add_power_data|=(u16)(left_dot_data[7]&0x0002)<<3;
	Add_power_data|=(u16)(left_dot_data[9]&0x0080)>>1;
	Add_power_data|=(u16)(left_dot_data[12]&0x0020)<<3;
	Add_power_data|=(u16)(left_dot_data[15]&0x0008)<<7;
	Add_power_data|=(u16)(left_dot_data[18]&0x0002)<<11;
	L6452_PowerOutput(Add_power_data);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,8);
	Add_power_data|=(u16)(left_dot_data[2]&0x0001);
	Add_power_data|=(u16)(left_dot_data[4]&0x0040)>>4;
	Add_power_data|=(u16)(left_dot_data[7]&0x0010);
	Add_power_data|=(u16)(left_dot_data[10]&0x0004)<<4;
	Add_power_data|=(u16)(left_dot_data[13]&0x0001)<<8;
	Add_power_data|=(u16)(left_dot_data[15]&0x0040)<<4;
	Add_power_data|=(u16)(left_dot_data[18]&0x0010)<<8;
	L6452_PowerOutput(Add_power_data);

    //提速补偿 低电平
    GPIO_ResetBits(XM_STEP_PORT, XM_STEP_PIN);
	
	Add_power_data=0;
	L6452_ChannelOutput(CHANNEL_B,9);
	Add_power_data|=(u16)(left_dot_data[2]&0x0008)>>3;
	Add_power_data|=(u16)(left_dot_data[5]&0x0002)<<1;
	Add_power_data|=(u16)(left_dot_data[7]&0x0080)>>3;
	Add_power_data|=(u16)(left_dot_data[10]&0x0020)<<1;
	Add_power_data|=(u16)(left_dot_data[13]&0x0008)<<5;
	Add_power_data|=(u16)(left_dot_data[16]&0x0002)<<9;
	Add_power_data|=0;
	L6452_PowerOutput(Add_power_data);
}



//HP45打印测试
//打印测试
//给buff赋值
/***************************************************
*函数名称： H45_PrintTestMoveDataToBuf
*函数功能： 将数据放到打印buf中
*输入参数： buf就是要打印的数据缓存
*输出参数： none
*******************************************************/
void HP45_PrintTestMoveDataToBuf(uint8_t*buf)
{

}


//彩色机打印一排刷
/***************************************************
*函数名称： HP45_PrintOneLine
*函数功能： 将buf中的数据通过调用45打印算法打印出来
*输入参数： buf就是要打印的数据缓存
*输出参数： none
*******************************************************/
void HP45_PrintOneLine(uint8_t* buf)
{
	HP45_PrintData(buf);
}



//HP45打印程序
/************************HP45机打印****************************/
//HP45计算图片大小
//输入参数为长和宽
//返回值为图片大小
/***************************************************
*函数名称： HP45_MatchTheSizeOfPicture
*函数功能： 根据图片的长和宽计算图片总大小
*输入参数： ThePictureOfX_px：长度  ThePictureOfY_px：宽度
*输出参数： none
*返回值：	图片大小
*******************************************************/
uint32_t HP45_MatchTheSizeOfPicture(uint16_t ThePictureOfX_px,uint16_t ThePictureOfY_px)
{
	uint32_t TheSizeOfPicture;
	//计算图片有多少个byte
    TheSizeOfPicture   =   ThePictureOfX_px * ThePictureOfY_px / HP45_INKCNT_OF_ONE_LINE * HP45_BYTES_OF_ONE_LINE * 2;
    return  TheSizeOfPicture;
}



//定义中心变量 之所以定在这里是因为  每个墨盒有对应的中心位置 
static uint16_t HP45_XCenter	=	5300;				//X默认值是5300
static uint16_t HP45_YCenter	=	3250;				//X默认值是3250
//修改中心
/******************************
*函数名称：HP45_ModifCenter
*函数功能：修改中心值
*输入参数：X y
*输出参数：none
****************************/
void HP45_ModifCenter(uint16_t x,uint16_t y)
{
	HP45_XCenter	=	x;
	HP45_YCenter	=	y;
}

//取出X中心
/******************
*函数名称：HP45_TakeOutXCenter
*函数功能：取出X中心
*输入参数：none
*输出参数：none
*******************/
uint16_t HP45_TakeOutXCenter(void)
{
	return HP45_XCenter;
}
//取出Y中心
/******************
*函数名称： HP45_TakeOutYCenter
*函数功能： 取出Y中心
*输入参数： none
*输出参数： none
*******************/
uint16_t HP45_TakeOutYCenter(void)
{
	return HP45_YCenter;
}


//彩色机将数据放到buf中
/************************************
*函数名称： HP45_TakeOutDataFromRamToBuf
*函数功能： 从RAM中取出数据到buf
*输入参数： ram ：存储数据的地址
*输出参数： buf为为准备打印的缓存 45 buf为19bytes
************************************/
void HP45_TakeOutDataFromRamToBuf(uint8_t *buf,uint8_t *ram)
{
	for(uint16_t i = 0;i < HP45_BYTES_OF_ONE_LINE;i++)
		buf[i]	=	ram[i];
}

//清洗墨盒
/**********************************
*函数名称： HP45_RinseInk
*函数功能： 清洗墨盒 
*输入参数： none
*输出参数： none
*备注    ： 喷头移动到接墨盒处，喷出一定量的墨水清洗喷头
************************************/
void HP45_RinseInk(void)
{
    uint8_t buff[HP45_BYTES_OF_ONE_LINE];
	//给buff赋初值
    for(uint8_t i = 0;i < HP45_BYTES_OF_ONE_LINE;i++)
		buff[i]   =   0xff;    
    //移动到接墨盒位置
    MOTOR_XY_MoveToDot(HP45_XM_RINSE_INK_POSITION,HP45_YM_RINSE_INK_POSITION);
    //关闭X轴于Y轴电机防止在清洗墨盒的时候移动
    XM_Disable();
    YM_Disable();
    //加热墨盒
    for(uint32_t i = 0;i < L6452_GetLongHeatCnt();i++)
    {
        L6452_HeatInk(1);
        delay_us(15);
    } 
    //喷墨清洗
    for(uint32_t i = 0;i < HP45_RINSE_INK_JET;i++)
        HP45_PrintOneLine(buff);   
}

//45的打印驱动
/**********************************
*函数名称： HP45_PrintDriver
*函数功能： 打印驱动 
*输入参数： ThePictureOfX_px ：X方向点数  
*			ThePictureOfY_px ：Y方向点数
*输出参数： none
************************************/
void HP45_PrintDriver(uint16_t ThePictureOfX_px,uint16_t ThePictureOfY_px)
{
	//获取图片大小
	uint32_t PictureSize	=	HP45_MatchTheSizeOfPicture(ThePictureOfX_px,ThePictureOfY_px);
	//XY 移动到起点位置
	uint16_t x_print_origin  =    ThePictureOfX_px / 2  * HP45_STEPS_BETWEEN_TWO_POINTS + HP45_XM_INCREASE_SPEED_STEP;
	if( x_print_origin 	<	HP45_TakeOutXCenter())
		x_print_origin =  	HP45_TakeOutXCenter() - x_print_origin ;
	else 
		x_print_origin =  0;							
	uint16_t y_print_origin  =    ThePictureOfY_px / 2 * HP45_STEPS_BETWEEN_TWO_POINTS;
	if( y_print_origin	<	HP45_TakeOutYCenter())
		y_print_origin 	= 	HP45_TakeOutYCenter() - y_print_origin;
	else
		y_print_origin = 0;	       
    //计算起点
    if(x_print_origin   <   HP45_XM_RINSE_INK_POSITION)
        x_print_origin  =   0;
    else
        x_print_origin  -=  HP45_XM_RINSE_INK_POSITION;
    
    if(y_print_origin   <   HP45_YM_RINSE_INK_POSITION)
        y_print_origin  =   0;
    else
        y_print_origin  -=  HP45_YM_RINSE_INK_POSITION;

	uint8_t buffer[HP45_BYTES_OF_ONE_LINE];
    uint16_t x_cnt;
    uint8_t x_dir_flag = FLAG_HIGH;
    uint32_t SzieOfDataPrinted	=	0;
	//每一排刷的数据量
	uint32_t datasizeofeachline = ThePictureOfX_px * HP45_BYTES_OF_ONE_LINE;
    uint32_t pram_addr  =   0;    
    
    //清洗墨盒    
    HP45_RinseInk();    
	//移动到起点
	MOTOR_XY_MoveToDot_NoReset(x_print_origin,y_print_origin);	
    XM_Enable();
    YM_Enable();     
	//死循环 当图片完全打印完后就直接返回函数
	while(1)
    {   
	    //取一排刷数据
		SRAM_ReadDate((uint8_t*)(RAM_GetDataBufAddr()),pram_addr,0,datasizeofeachline );
		pram_addr  =  pram_addr + datasizeofeachline;
        //加热300次 
        for(uint32_t m = 0;m < L6452_GetShortHeatCnt();m++)
        {
            L6452_HeatInk(1);
            delay_us(15);
        }        
        if (x_dir_flag == FLAG_HIGH)  //0,2,4, 6....
        {
			XM_Dir_Forward();
			x_dir_flag = FLAG_LOW;
            //X轴加速
            XM_IncreaseSpeed();
            for(x_cnt = ThePictureOfX_px;x_cnt > 0;x_cnt--)
			{   
				//到DMA缓存地址取27个byte到buffer中
                HP45_TakeOutDataFromRamToBuf(buffer,(uint8_t*)(RAM_GetDataBufAddr() + (ThePictureOfX_px - x_cnt)*HP45_BYTES_OF_ONE_LINE));
				HP45_PrintOneLine(buffer);
                SzieOfDataPrinted   +=  HP45_BYTES_OF_ONE_LINE; 
			}
            //X轴减速
            XM_ReduceSpeed();
			//判断是不是打印完成  如果已经打印的数据量大于等于数据总量则说明打印完成
			if(SzieOfDataPrinted	>=	PictureSize)			
			{
                XM_Disable();
                YM_Disable();                    
				return;
			}
			YM_Dir_Forward();
			//当一排打完后下降到另一排
			YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);
        }
        else
        {
			XM_Dir_Reverse();
			x_dir_flag = FLAG_HIGH;
            //X轴加速
            XM_IncreaseSpeed();            
            for(x_cnt = ThePictureOfX_px;x_cnt > 0;x_cnt--)
			{
                HP45_TakeOutDataFromRamToBuf(buffer,(uint8_t*)(RAM_GetDataBufAddr() + (ThePictureOfX_px - x_cnt)*HP45_BYTES_OF_ONE_LINE));
				HP45_PrintOneLine(buffer);  
				SzieOfDataPrinted	+=	HP45_BYTES_OF_ONE_LINE; 
			}
            //X轴减速
			XM_ReduceSpeed();
			//判断是不是打印完成  如果已经打印的数据量大于等于数据总量则说明打印完成
			if(SzieOfDataPrinted	>=	PictureSize)		
			{//完成接收
				XM_Disable();
				YM_Disable();
				return;
			}
			YM_Dir_Forward();			
			YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);				
        }
    }
}


//打印测试
/*************************
*函数名称： HP45_PrintTestDriver
*函数功能： 打印测试驱动
*输入参数： none
*输出参数： none
*************************/
void HP45_PrintTestDriver(void)
{
	uint8_t buff[HP45_BYTES_OF_ONE_LINE];
	uint16_t x_print_origin	=	HP45_X_ORIGIN;
	uint16_t y_print_origin	=	HP45_Y_ORIGIN;	
	uint8_t x_dir_flag 		= 	FLAG_HIGH;
	uint16_t x_cnt,y_cnt	=	0;	
	//给buff赋初值
    for(uint8_t i = 0;i < HP45_BYTES_OF_ONE_LINE;i++)
		buff[i]   =   0xff;
    //计算起点
    if(x_print_origin   <   HP45_XM_RINSE_INK_POSITION)
        x_print_origin  =   0;
    else
        x_print_origin  -=  HP45_XM_RINSE_INK_POSITION;
    
    if(y_print_origin   <   HP45_YM_RINSE_INK_POSITION)
        y_print_origin  =   0;
    else
        y_print_origin  -=  HP45_YM_RINSE_INK_POSITION;
    
    //清洗墨盒    
    HP45_RinseInk();
	//XY轴移动到起点
    MOTOR_XY_MoveToDot_NoReset(x_print_origin,y_print_origin);
    //使能X轴电机
    XM_Enable();
	//使能Y轴电机
    YM_Enable();        
	//进入打印循环
	//打印单层 2排
	while (y_cnt	<	 2)
	{
        //打印拐点加热300次 
        for(uint32_t m = 0;m < L6452_GetShortHeatCnt();m++)
        {
            L6452_HeatInk(1);
            delay_us(15);
        }       
        if (x_dir_flag	==	FLAG_HIGH)
        {
			//修改方向标识
			x_dir_flag	= 	FLAG_LOW;
			//确定X轴方向
			XM_Dir_Forward();
			//X加速
			XM_IncreaseSpeed();
			//x轴方向移动600步
            for(x_cnt = HP45_PRINT_TEST_X_CNT;x_cnt > 0;x_cnt--)
            {   
				//打印一排刷
				HP45_PrintOneLine(buff);
            }          
			//X减速
			XM_ReduceSpeed();
			//确定Y轴方向
			YM_Dir_Forward();
			//当一排打完后下降到另一排
            YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_ROW);
            y_cnt++;           
        }
        else
        {
			//修改方向标识
			x_dir_flag	= 	FLAG_HIGH;			
			//确定X轴方向
			XM_Dir_Reverse();		
			//X加速
			XM_IncreaseSpeed();
            for(x_cnt = HP45_PRINT_TEST_X_CNT;x_cnt > 0;x_cnt--)
            {
				//打印一排刷
				HP45_PrintOneLine(buff);
            }
			//X减速
			XM_ReduceSpeed();
			//确定Y轴方向
			YM_Dir_Forward();
			//当一排打完后下降到另一排
            YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_ROW);			
            y_cnt++;
        }   
    }
	//中间空格1/2排
	YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);	
	y_cnt	=	0;
	//双叠的打印2排 来回共4次	
	while (y_cnt < 5)		
    {
        //打印拐点加热300次 
        for(uint32_t m = 0;m < L6452_GetShortHeatCnt();m++)
        {
            L6452_HeatInk(1);
            delay_us(15);
        }      
		//根据排数给buffer赋值
		for(uint8_t i = 0;i < 19;i++)
			buff[i]   =   0xff;
		//第0排 buffer 上半部分为0 下半部分为1
		if(y_cnt  == 0)   
		{
			uint8_t i;
			for(i = 0;i < 9;i++)
				buff[i]   =   0x0;
			buff[i] = 0xf0;
		}
		//第4排 上半部分为1， 下半部分为0
		else if(y_cnt == 4)
		{
			uint8_t i;
			for(i = 0;i < 9;i++)
				buff[i]   =   0xff;
			buff[i]  =   0x0f;
			i++;
			for(;i < 19 ;i++)
				buff[i]  =   0;    	   	
		}		
        if (x_dir_flag	==	FLAG_HIGH)
        {
			//修改方向标识
			x_dir_flag	= 	FLAG_LOW;
			//确定X轴方向
			XM_Dir_Forward();
			//X加速
			XM_IncreaseSpeed();
			//600步
            for(x_cnt = HP45_PRINT_TEST_X_CNT;x_cnt > 0;x_cnt--)
            {    			
				//打印一排刷
				HP45_PrintOneLine(buff);
            }
			//X减速
			XM_ReduceSpeed();
			//确定Y轴方向
			YM_Dir_Forward();
			//当一排打完后下降到另一排
            YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);
            y_cnt++;
        }
        else 
        {
			//修改方向标识
			x_dir_flag	= 	FLAG_HIGH;			
			//确定X轴方向
			XM_Dir_Reverse();		
			//X加速
			XM_IncreaseSpeed();
            for(x_cnt = HP45_PRINT_TEST_X_CNT;x_cnt > 0;x_cnt--)
            {				
				//打印一排刷
				HP45_PrintOneLine(buff);
            }
			//X减速
			XM_ReduceSpeed();
			//确定Y轴方向
			YM_Dir_Forward();
			//当一排打完后下降到另一排
            YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);			
            y_cnt++;
        }        
    }	
}

//HP45老化程序
/*************************
*函数名称： HP45_MachineBurnIn
*函数功能： 45老化程序
*输入参数： none
*输出参数： none
*************************/
void HP45_MachineBurnIn(void)
{
    //修改中心位置
    ModifCenter(5350,3500);
    //图片长和宽
    uint16_t ThePictureOfX_px   =   962;
    uint16_t ThePictureOfY_px   =   1050;    
	//获取图片大小
	uint32_t PictureSize	=	HP45_MatchTheSizeOfPicture(ThePictureOfX_px,ThePictureOfY_px);
	//XY 移动到起点位置
	uint16_t x_print_origin  =    ThePictureOfX_px / 2  * HP45_STEPS_BETWEEN_TWO_POINTS + HP45_XM_INCREASE_SPEED_STEP;
	if( x_print_origin 	<	HP45_TakeOutXCenter())
		x_print_origin =  	HP45_TakeOutXCenter() - x_print_origin ;
	else 
		x_print_origin =  0;							
	uint16_t y_print_origin  =    ThePictureOfY_px / 2 * HP45_STEPS_BETWEEN_TWO_POINTS;
	if( y_print_origin	<	HP45_TakeOutYCenter())
		y_print_origin 	= 	HP45_TakeOutYCenter() - y_print_origin;
	else
		y_print_origin = 0;	
      
    //计算起点
    if(x_print_origin   <   HP45_XM_RINSE_INK_POSITION)
        x_print_origin  =   0;
    else
        x_print_origin  -=  HP45_XM_RINSE_INK_POSITION;
    
    if(y_print_origin   <   HP45_YM_RINSE_INK_POSITION)
        y_print_origin  =   0;
    else
        y_print_origin  -=  HP45_YM_RINSE_INK_POSITION;

	uint8_t buff[HP45_BYTES_OF_ONE_LINE];
    uint16_t x_cnt;
    uint8_t x_dir_flag = FLAG_HIGH;
    uint32_t SzieOfDataPrinted	=	0;

    //清洗墨盒    
    HP45_RinseInk(); 
	//XY轴移动到起点
    MOTOR_XY_MoveToDot_NoReset(x_print_origin,y_print_origin);
    //使能X轴电机
    XM_Enable();
	//使能Y轴电机
    YM_Enable();        
	//死循环 当图片完全打印完后就直接返回函数
	while(1)
    {   
        //给buf赋值 为全0xff
        uint8_t i;
        for(i = 0;i < HP45_BYTES_OF_ONE_LINE;i++)
            buff[i] =   0xff;
        //加热300次 
        for(uint32_t m = 0;m < L6452_GetShortHeatCnt();m++)
        {
            L6452_HeatInk(1);
            delay_us(15);
        }
        //给buf赋值 第一排刷
        if(SzieOfDataPrinted    <   HP45_BYTES_OF_ONE_LINE * ThePictureOfX_px)
        {
			for(i = 0;i < 9;i++)
				buff[i]   =   0x0;
			buff[i] = 0xf0;
        }
        //最后一排刷  给buff赋值
        else if(SzieOfDataPrinted   >=  PictureSize - HP45_BYTES_OF_ONE_LINE * ThePictureOfX_px)
        {
			for(i = 0;i < 9;i++)
				buff[i]   =   0xff;
			buff[i]  =   0x0f;
			i++;
			for(;i < 19 ;i++)
				buff[i]  =   0;             
        }

        if (x_dir_flag == FLAG_HIGH)  //0,2,4, 6....
        {
			XM_Dir_Forward();
			x_dir_flag = FLAG_LOW;
            //X轴加速
            XM_IncreaseSpeed();
            for(x_cnt = ThePictureOfX_px;x_cnt > 0;x_cnt--)
			{   
				HP45_PrintOneLine(buff);
                SzieOfDataPrinted   +=  HP45_BYTES_OF_ONE_LINE; 
			}
            //X轴减速
            XM_ReduceSpeed();
			//判断是不是打印完成  如果已经打印的数据量大于等于数据总量则说明打印完成
			if(SzieOfDataPrinted	>=	PictureSize)			
			{
                XM_Disable();
                YM_Disable();                    
				return;
			}
			YM_Dir_Forward();
			//当一排打完后下降到另一排
			YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);
        }
        else
        {
			XM_Dir_Reverse();
			x_dir_flag = FLAG_HIGH;
            //X轴加速
            XM_IncreaseSpeed();            
            for(x_cnt = ThePictureOfX_px;x_cnt > 0;x_cnt--)
			{
				HP45_PrintOneLine(buff);  
				SzieOfDataPrinted	+=	HP45_BYTES_OF_ONE_LINE; 
			}
            //X轴减速
			XM_ReduceSpeed();
			//判断是不是打印完成  如果已经打印的数据量大于等于数据总量则说明打印完成
			if(SzieOfDataPrinted	>=	PictureSize)		
			{//完成接收
				XM_Disable();
				YM_Disable();
				return;
			}
			YM_Dir_Forward();			
			YM_ContinueRunStep(HP45_YM_MOVE_TO_NEXT_HALF_ROW);				
        }
    }    
}

//自定义方法
/*************************
*函数名称： HP6578_DEFINE_Method_n
*函数功能： HP6578自定义方法
*输入参数： none
*输出参数： none
*************************/
void HP45_DEFINE_Method_n(uint32_t Pparameter)
{
}




